package com.example.livemall.service.impl;


import com.example.livemall.dto.LzjResult;
import com.example.livemall.entity.Item;
import com.example.livemall.mapper.HotProductMapper;
import com.example.livemall.service.HotProductService;
import com.example.livemall.vo.ProductVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;


import java.util.List;
import java.util.stream.Collectors;

/**
 * 热销商品服务业务逻辑层
 */
@Service
public class HotProductServiceImpl implements HotProductService {

    @Autowired
    private HotProductMapper hotProductMapper;

    @Value("${origin}")
    private String origin;

    /**
     * 查询热销商品，根据销量排序，查询条件为城市。获取 4 条数据。
     * 查询的返回结果，热销商品的数量必须是 4 。
     * 查询条件所在城市的热销商品数量大于 4 的时候，只查询销量排序的前 4 位商品。
     * 如果条件所在城市的热销商品数量小于 4 的时候，从其他的城市热销商品中查询销量排序考前的补足。
     *
     * @param city
     * @return
     */
    @Override
    public LzjResult selectHotProductList(String city) {

        List<Item> itemList = hotProductMapper.selectHotProductList(city);

        itemList.stream()
                .map(item -> {
                    item.setInfo(hotProductMapper.selectInfo(item.getId()));
                    item.setImgs(hotProductMapper.selectImg(item.getId()));
                    return null;
                }).collect(Collectors.toList());


        if (itemList.size() < 4) {
            // 查询的热销商品数量不足，需要查询其他城市的热销商品，填充到当前查询结果
            // 查询条件， 查询当前城市以外的其他城市热销商品，避免重复数据。
            // 排序和分页
            List<Item> otherList = hotProductMapper.selectOtherHotProductList(city, 4 - itemList.size());


            // 将其他城市的热销商品数据，填充到当前城市的热销商品数据集合中。补足 4 条数据。
            itemList.addAll(otherList);
        }
        // 将图片路径，从相对路径转换为绝对路径。增加 Nginx 地址前缀。
        itemList = changeImgsUrl(itemList);

        List<ProductVo> list = itemList.stream()
                .map(item -> new ProductVo(item.getId(), item.getTitle(), item.getImgs().get(0), origin))
                .collect(Collectors.toList());
        return LzjResult.success("查询成功", list);
    }

    // 将集合中的每个 Item 类型对象的图片地址，增加前缀。
    private List<Item> changeImgsUrl(List<Item> itemList) {
        itemList.forEach(item ->
				item.setImgs(item.getImgs().stream().map(img -> origin + img).collect(Collectors.toList()))
		);
        return itemList;
    }

}